package com.example.homework;

import java.io.*;

/**
 * 目标：查找出指定的文件复制到目标文件夹中
 */
public class HomeWork03 {
    public static void main(String[] args) throws IOException {
        // 创建一个type类型变量，用于记录文件类型
        String type = ".jpg";
        // 创建File对象srcDir,代表源文件夹
        File srcDir = new File("D:\\File\\Test");
        // 创建File对象destDir,代表目标文件夹(把源文件夹剪切到目标文件夹中)
        File destDir = new File("D:\\File\\Test2");
        // 调用copyTypeFiles方法,传递源文件夹和目标文件夹,完成文件夹的复制
        copyTypeFiles(srcDir, type, destDir);
    }

    /**
     * 复制指定类型文件的方法
     * @param srcDir 源文件夹
     * @param type 类型
     * @param destDir 目标文件
     */
    private static void copyTypeFiles(File srcDir, String type, File destDir) throws IOException {
        // 1.判断目标文件夹是否存在，如果不存在则创建文件夹
        if (!destDir.exists()) {
            destDir.mkdirs();
        }

        // 2.获取源文件夹中的所有一级文件对象
        File[] files = srcDir.listFiles();

        // 3.判断数组是否为null或者没有内容，直接返回
        if (files == null || files.length == 0) {
            return;
        }

        // 4.遍历这个数组
        for (File file : files) {
            if (file.isFile()) {
                // 说明是文件
                // 在判断代码片段检查文件名是否以指定类型（type）结尾：
                // 若文件名以 type 结尾，条件判断返回 true。
                // 否则返回 false。
                if (file.getName().endsWith(type)) {
                    // 复制文件到目标文件夹中
                    copyDirToDir(file, destDir);
                }
            } else {
                // 说明是文件夹
                copyTypeFiles(file, type, destDir);
            }
        }
    }

    /**
     * 复制文件夹到文件夹的方法
     * @param file 源文件
     * @param dir 目标文件
     * @throws IOException 抛出异常
     */
    public static void copyDirToDir(File file, File dir) throws IOException {
        // 1.创建文件字节输入流FileInputStream绑定源文件
        InputStream is = new FileInputStream(file);

        // 2.定义一个byte数组，保存每次读取到的字节量
        byte[] bytes = new byte[1024];

        // 3.定义一个变量接收读取到的字节数
        int len;

        // 4.给目标文件夹创建文件对象
        File destFile = new File(dir, file.getName());

        // 5.创建文件字节输出流OutputStream的对象，绑定目标文件
        OutputStream os = new FileOutputStream(destFile);

        // 6.循环的读取文件，写入到目标文件中
        while ((len = is.read()) != -1) {
            os.write(bytes, 0, len);
        }

        // 7.关闭资源
        os.close();
        is.close();
    }
}
